#ifndef __BSP_UART_ISR_H
#define __BSP_UART_ISR_H

/* Private includes ----------------------------------------------------------*/
#include "mid_circular_buffer.h"
#include "stdio.h"
#include "stdint.h"
#include "string.h"
/* Private includes ----------------------------------------------------------*/

/* Exported macro ------------------------------------------------------------*/
#define RX_DATA_LEN             (80)    // UART�������ݻ���������
#define EQUIPMENT_LEN           (80)    // �豸��������������
/* Exported macro ------------------------------------------------------------*/

/* Exported types ------------------------------------------------------------*/

/**
 * @brief ���ý��ö��
 */
typedef enum
{
    CFG_VALID = 0,		// ������Ч
    CFG_INVALID,		// ������Ч
    CFG_ERROR,			// ���ô���
} config_t;

/**
 * @brief Э������ṹ��
 *        �洢Э��ͷ��������ݼ�У��͵���Ϣ
 */
typedef struct
{
    union u_agreement
    {
        uint8_t dat[10]; // ԭʼЭ��ͷ����
        struct t_agreement
        {
            uint8_t hand[2];      // Э��ͷ
            uint8_t v;            // Э��汾
            uint8_t null[2];      // ����
            uint8_t cmd_group;    // ������
            uint8_t cmd_num;      // �����
            uint8_t zero;         // ����
            uint16_t len;         // ���ݳ���
        }agreement_t;
    }agreement_u;
    char data[RX_DATA_LEN]; // Э��������
    uint8_t sum;            // У���
} Agreement_T;

/**
 * @brief ϵͳ����������
 *        ���ڴ洢�ͷ����豸����
 */
typedef union
{
    uint8_t dat[EQUIPMENT_LEN]; // ԭʼ��������
    struct agreement
    {
        uint8_t hand[2];      // Э��ͷ
        uint8_t v;            // Э��汾
        uint8_t null[2];      // ����
        uint8_t cmd_group;    // ������
        uint8_t cmd_num;      // �����
        uint8_t zero;         // ����
        uint16_t len;         // ���ݳ���
    }agreement_t;
} Parameters_U;

/**
 * @brief ��������ṹ��
 *        �������������������š�����ż���������
 */
typedef struct
{
    uint8_t cmd_group;   // �������
    uint8_t cmd_num;     // �����
    void (*func)(uint8_t *send_dat, uint16_t *len, uint8_t start); // ���ʹ�������ָ��
} send_cmd_t;

/**
 * @brief ��������ṹ��
 *        �������������������š�����ż���������
 */
typedef struct
{
    uint8_t cmd_group;   // �������
    uint8_t cmd_num;     // �����
    config_t (*func)(Agreement_T *g_garameters); // ���ƴ�������ָ��
} control_cmd_t;

/**
 * @brief ������ڽṹ��
 *        ���ڹ������ͺͿ��������
 */
typedef struct
{
    send_cmd_t        *p_send_cmd;     // ���������ָ��
    control_cmd_t  *p_control_cmd;     // ���������ָ��
} cmd_entry_t;
/* Exported types ------------------------------------------------------------*/

/* Exported functions prototypes ---------------------------------------------*/

/**
 * @brief Э�����ݽ��������
 * @param cb   ѭ��������ָ��
 * @param comx ͨ�Ŷ˿ں�
 */
void Analytic_function(CircularBuffer_t *cb, uint8_t comx);

/**
 * @brief UART����������
 */
void uart_task(void);
/* Exported functions prototypes ---------------------------------------------*/

#endif
